package com.itbaizhan.jdkDynaimc;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.SQLOutput;

//代理方式类  因为动态代理不会生成代理类，只会生成对象
//定义被代理方法的增强方式
//该类实现InvocationHandler  重写invoke（提及，调用，援用，援引）方法 ， 定义方法的增强方式
public class ShoppingProxy implements InvocationHandler {
    //传进来的被代理对象  要写在构造方法
    private Apple apple;

    public ShoppingProxy(Apple apple) {
        this.apple = apple;
    }

    /*定义原方法的增强方式
    * @param proxy  被代理对象
    * @param method 被代理对象调用的方法
    * @param args  被代理对象调用的方法时，传入的参数
    * @return  方法的返回值*/
    //用反射基础
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //定义被代理对象执行的方法名
        String name = method.getName();
        if("sell".equals(name)){
            double price = (double)args[0]*0.9;//增强参数，args[]是数组  价格9折
            //反射执行方法  对象与参数
            Object result = method.invoke(apple,price);
            return result+"充电器";//增强返回值
        }else if("repair".equals(name)){
            //执行repair()方法之前 执行下面的内容
            System.out.println("专属客服为您服务");//增强方法流程
            return method.invoke(apple,args);//这里参数没有变

        }else {
             return method.invoke(apple,args);//什么都不增强
        }


    }
}
